import CacheCenter from "../cacheCenter/index";

let _requestConfig;
export function registerUtils(requestConfig) {
	_requestConfig = requestConfig;
}
// 检查url 是否不在token白名单中
// url 检查 规则
// "*...url" 检查结尾
// "...url*" 检查开头
// "!!!...url" 检查严格相等
// "url" 包含 检查包含
// 函数_checkTokenWhiteListUnPass用于检查url是否在_requestConfig.tokenPassWhiteList中
function _checkTokenWhiteListUnPass(url, useBaseUrl) {
	// 定义变量unPass，初始值为true
	let unPass = true;
	// 遍历_requestConfig.tokenPassWhiteList
	_requestConfig.tokenPassWhiteList.forEach(item => {
		// 如果item以*开头
		if (item.startsWith("*")) { // 结尾相等
			// 如果url以item结尾
			let compareUrl = item.replace(/\*/g, "");
			let compareResult = url.endsWith(compareUrl);
			if (compareResult) {
				// 将unPass设置为false
				unPass = false;
			}
			// 如果item以*结尾
		} else if (item.endsWith("*")) { // 开头相等
			// 如果url以item开头
			let compareUrl = useBaseUrl ? `${_requestConfig.baseUrl}${item}` : item;
			compareUrl = compareUrl.replace(/\*/g, "")
			let compareResult = url.startsWith(compareUrl);
			if (compareResult) {
				// 将unPass设置为false
				unPass = false;
			}
		} else if (item.startsWith("!!!")) { // 严格相等
			let compareUrl = useBaseUrl ? `${_requestConfig.baseUrl}${item}` : item;
			compareUrl = compareUrl.replace(/!!!/g, "")
			let compareResult = url === compareUrl;
			if (compareResult) {
				unPass = false;
			}
			// 否则
		} else { // 包含
			// 如果url包含item
			let compareResult = url.includes(item)
			if (compareResult) {
				// 将unPass设置为false
				unPass = false;
			}
		}
	})
	// 返回unPass
	return unPass;
}

// url 添加时间戳
function _appendTimeStamp(param) {
	const {
		method,
		url
	} = param || {};
	// 仅get请求需要添加时间戳
	if (method === 'GET') {
		return url.includes('?') ? `${url}&t=${Date.now()}` : `${url}?t=${Date.now()}`;
	}
	return url;
}

// 定义一个函数，用于处理请求参数
export function handlerParam(param) {
	// 检查url是否在token白名单中，
	// 如果在，不需要添加token
	// 如果不在，则继续检查token是否存在并添加至请求头中
	if (_checkTokenWhiteListUnPass(param.url, param.useBaseUrl)) {
		if (!CacheCenter.readCacheData(_requestConfig.accessTokenCacheKey)) {
			// 如果token不存在，则调用callback函数，并传入false
			typeof callback === 'function' && callback(false)
		} else {
			// 如果token存在，则将token添加到请求头中
			param.header = {
				...param.header,
				'Authorization': `Bearer ${CacheCenter.readCacheData(_requestConfig.accessTokenCacheKey)}`
			}
		}
	}
	// 添加时间戳到url中
	let url = _appendTimeStamp(param);
	// 返回处理后的参数
	return {
		...param,
		url
	}
}

// 定义一个函数，将请求函数转换为Promise对象
export function packRequest2Promise(requestFn, param, callback) {
	// 返回一个新的Promise对象
	return new Promise((resolve, reject) => {
		// 调用请求函数，传入参数和回调函数
		requestFn(param, (success, data) => {
			// 如果回调函数是函数类型，则调用回调函数
			typeof callback == 'function' && callback(success, data);
			// 如果请求成功，则调用resolve函数，传入数据
			if (success) {
				resolve(data);
				// 否则，调用reject函数，传入数据
			} else {
				reject(data);
			}
		})
	})
}

export default {
	registerUtils
}